package edu.hunau.cxb19.basic.class11;

import java.util.Arrays;

import org.junit.Test;

/**
 *
 * @author hb
 *
 *         2020-02-21 15:52:48
 */
public class QuickSortDemo {

	/**
	 * 交换i和j上的数据
	 * 
	 * @param data
	 * @param i
	 * @param j
	 */
	public static void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

	/**
	 * 进行分区排序
	 * 
	 * @param data
	 * @param start
	 * @param end
	 */
	public static void subSort(int[] data, int start, int end) {
		if (start < end) {
			// 设定基准值pivot
			int pivot = data[start];
			// 声明低位low和高位high
			int low = start;
			int high = end + 1;
			while (true) {
				// 将low向后查询，直到找到大于基准数据的下标
				while (low < end && data[++low] <= pivot)
					;
				// 将high向前查询，直到找到小于基准数据的下标
				while (high > start && data[--high] >= pivot)
					;
				if (low < high) {
					// 进行数据的交换
					swap(data, low, high);
				} else {
					break;
				}
			}
			// 和基准值进行交换
			swap(data, start, high);
			// 递归调用
			subSort(data, start, high - 1);
			subSort(data, high + 1, end);
		}
	}

	public static void quickSort(int[] data) {
		subSort(data, 0, data.length - 1);
	}

	@Test
	public void testQuickSort() {
		int[] data = { 6, 3, 10, 4, 9, 5, 1, 2, 7, 8 };
		System.out.println("排序前的结果:"+Arrays.toString(data));
		quickSort(data);
		System.out.println("排序后的结果:"+Arrays.toString(data));
		
	}
}
